package work.thread_eg.concurrent.atomic;

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 *
 * 原子类atomic
 * 使用场景：一个简单的、高效的、线程安全的递增或者递减方案
 * 多个线程争夺一个外部资源的时候 为了解决数量不一致的问题 （一般是递增或者递减）
 *
 * @author shenminglong@kedacom.com
 * @date 2022-01-07
 */
public class AtomicTest01 {
    public static void main(String[] args) {
        // AtomicInteger的使用
        AtomicInteger a1 = new AtomicInteger(90);
        // getAndAdd() 方法 会改变AtomicInteger对象的数据 返回值是之前的数据
        // 此时a1 是100
        Integer int1 = a1.getAndAdd(10);
        System.out.println(int1);
        System.out.println(a1);
        // compareAndSet() 如果输入值等于预期值，以原子的方式将该值设置为输入的值
        // 将本身对象和第一个参数做对比 相同的话 以原子的方式把对象变更为第二个参数的值
        a1.compareAndSet(100,200);
        System.out.println(a1);


        // AtomicIntegerArray 原子更新数组
        // AtomicIntegerArray对内部的数组元素进行修改时，不会影响传入的数组
        int[] value =new int[]{1,2,3,4};
        AtomicIntegerArray ai =new AtomicIntegerArray(value);
        ai.getAndSet(0,100);
        System.out.println(ai);
        System.out.println(Arrays.toString(value));

    }
}
